STM32固件库编程入门

您所在的位置:网站首页 编程 库是什么 STM32固件库编程入门

STM32固件库编程入门

2023-11-04 04:59| 来源: 网络整理| 查看: 265

目录

 

一、初识stm32固件库

1、什么是固件库

2、初识库函数

二、库函数新建工程

1、新建本地工程文件夹

2、新建工程

三、GPIO 输出—使用固件库点亮 LED

1、LED引脚宏定义

2、 LED 灯亮灭状态的宏定义

3、LED GPIO 初始化函数

4、主函数

工程文件结构的基本构成

软件设计

 

一、初识stm32固件库 资料准备: 《 STM32F4xx 参考手册》 《 STM32F4xx 规格书》 《 Cortex-M3 权威指南》 《 Cortex™-M4 内核参考手册》  STM32 标准库帮助文档——《 stm32f4xx_dsp_stdperiph_lib_um.chm 》 1、什么是固件库 ST 公司提供的标准软件库,包含了 STM32 芯片所有寄存器的控制操作,我们直接学习如何使用 ST 标准库,会极大地方便控制 STM32 芯片。

在library里有:

在使用库开发时,我们需要把 libraries 目录下的库函数文件添加到工程中,并查阅库帮助文档来了解 ST 提供的库函数 如我们写 STM32F4 的工程,必须用到其中的四个文件: core_cm4.h 、 core_cmFunc.h 、 corecmInstr.h、 core_cmSimd.h ,其它的文件是属于其它内核的,还有几个文件是 DSP 函数库使用的头文件。   Include 文件夹;只需把这些文件加进我们的工程文件即可,有兴趣的朋友可以深究 Device 文件夹下的是具体芯片直接相关的文件,包含启动文件、芯片外设寄存器定义、系统时钟初始化功能的一些文件。     system_stm32f4xx.c 文件:包含了 STM32 芯片上电后初始化系统时钟、扩展外部存储器用的函数 启动文件 :如STM32F446 型号使“startup_stm32f446xx.s” stm32f4xx.h 文件:是一个 STM32 芯片底层相关的文件。     STM32F10x_StdPeriph_Driver 文件夹: 文件夹下有 inc(include 的缩写)跟 src(source 的简写)这两个文件夹,这里的文件属于 CMSIS 之外的的、芯片片上外设部分。 Project文件夹   stm32f4xx_it.c : stm32f4xx_it.c:这个文件是专门用来编写中断服务函数的 stm32f4xx_conf.h 文件:使用这个配置文件根据芯片型号增减 ST 库的外设文件。 2、初识库函数 学会查阅库帮助文档是很有必要的。 二、库函数新建工程     1、新建本地工程文件夹 为了工程目录更加清晰,我们在本地电脑上新建一个“工程模板”文件夹,在它之下 再新建 6 个文件夹,具体如下:在本地新建好文件夹后,把准备好的库文件添加到相应的文件夹。 2、新建工程 ①选择 CPU 型号 ②在线添加库文件 ③添加组文件夹:文件从本地建好的工程文件夹下获取,双击组文件夹就会出现添加文件的路径,然后选择文件即可 ④先把上面提到的文件从 ST 标准库中复制到工程模版对应文件夹的目录下,然后在新建的工程中添加这些文件,双击组文件夹就会出现添加文件的路径,然后选择文件即可   ⑤ 设置文件是否加入编译   ⑥ 配置魔术棒选项卡(第一次配置的时候很重要!!!) ⑦下载仿真器配置     三、GPIO 输出—使用固件库点亮 LED 大致流程: 1. 使能 GPIO 端口时钟; 2. 初始化 GPIO 目标引脚为推挽输出模式; 3. 编写简单测试程序,控制 GPIO 引脚输出高、低电平。

1、LED引脚宏定义     编写应用程序要考虑更改硬件环境的情况,例如 LED 灯的控制引脚与当前的不一样,我们希望程序只需要做最小的修改即可在新的环境正常运行。 若更改了硬件环境,只修改这些硬件相关的宏即可,这些定义一般存储在头文件,即本例子中的“bsp_led.h”文件中   1 //引脚定义 2 /*******************************************************/ 3 //R 红色灯 4 #define LED1_PIN GPIO_Pin_10 5 #define LED1_GPIO_PORT GPIOH //GPIO_Pin_n可以理解为某端口脚在整个端口的位置。比方某GPIO口的第6管脚位置编码GPIO_Pin_6 被定义为 //((uint16_t)0x0040) 有兴趣的话,可以点击GPIO_Init( )进去看看。 6 #define LED1_GPIO_CLK RCC_AHB1Periph_GPIOH 7 8 //G 绿色灯 9 #define LED2_PIN GPIO_Pin_11 10 #define LED2_GPIO_PORT GPIOH 11 #define LED2_GPIO_CLK RCC_AHB1Periph_GPIOH 12 13 //B 蓝色灯 14 #define LED3_PIN GPIO_Pin_12 15 #define LED3_GPIO_PORT GPIOH 16 #define LED3_GPIO_CLK RCC_AHB1Periph_GPIOH 22 /************************************************************/ 以上代码分别把控制四盏 LED 灯的 GPIO 端口、 GPIO 引脚号以及 GPIO 端口时钟封装起来了。在实际控制的时候我们就直接用这些宏,以达到应用代码硬件无关的效果。 其中的 GPIO 时钟宏“RCC_AHB1Periph_GPIOH”和“RCC_AHB1Periph_GPIOD”是 STM32 标准库定义的 GPIO 端口时钟相关的宏,它的作用与“GPIO_Pin_x”这类宏类似, 是用于指示寄存器位的,方便库函数使用。它们分别指示 GPIOH 、 GPIOD 的时钟,下面初始化 GPIO 时钟的时候可以看到它的用法。 (区分GPIO、引脚、端口的概念。遇到宏不清楚的展开查看即可)   2、 LED 灯亮灭状态的宏定义 2 /* 直接操作寄存器的方法控制 IO */ 3 #define digitalHi(p,i) {p->BSRRL=i;} //设置为高电平 4 #define digitalLo(p,i) {p->BSRRH=i;} //输出低电平 5 #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态,Toggle是按钮 6 /*BSRRH 表示GPIO端口置高电平寄存器,将端口赋给它,即此端口变为高电平*/ /*ODR 表示GPIO端口数据寄存器*/ 7 8 /* 定义控制 IO 的宏 */ 9 #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_PIN) 10 #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_PIN) 11 #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_PIN) 12 13 #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_PIN) 14 #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_PIN) 15 #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_PIN) 16 17 #define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_PIN) 18 #define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_PIN) 19 #define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_PIN) 2021 /* 基本混色,后面高级用法使用 PWM 可混出全彩颜色,且效果更好 */ 2223 //红 24 #define LED_RED \ 25 LED1_ON;\ 26 LED2_OFF;\ 27 LED3_OFF 28 29 //绿 30 #define LED_GREEN \ 31 LED1_OFF;\ 32 LED2_ON;\ 33 LED3_OFF 34 35 //蓝 36 #define LED_BLUE \ 37 LED1_OFF;\ 38 LED2_OFF;\ 39 LED3_ON 40 41 42 //黄(红+绿) 43 #define LED_YELLOW \ 44 LED1_ON;\ 45 LED2_ON;\ 46 LED3_OFF 这部分宏控制 LED 亮灭的操作是直接向 BSRR 寄存器写入控制指令来实现的,对 BSRRL 写 1 输出高电平,对 BSRRH 写 1 输出低电平,对 ODR 寄存器某位进行异或操作 可反转位的状态。 3、LED GPIO 初始化函数 1 /** 2 * @brief 初始化控制 LED 的 IO 3 * @param 无 4 * @retval 无 5 */ 6 void LED_GPIO_Config(void) 7 { 8 /*定义一个 GPIO_InitTypeDef 类型的结构体*/ 9 GPIO_InitTypeDef GPIO_InitStructure; 10 11 /*开启 LED 相关的 GPIO 外设时钟*/ 12 RCC_AHB1PeriphClockCmd ( LED1_GPIO_CLK| 13 LED2_GPIO_CLK| 14 LED3_GPIO_CLK| 15 LED4_GPIO_CLK, 16 ENABLE); 17 18 /*选择要控制的 GPIO 引脚*/ 19 GPIO_InitStructure.GPIO_Pin = LED1_PIN; 20 21 /*设置引脚模式为输出模式*/ 22 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 23 24 /*设置引脚的输出类型为推挽输出*/ 25 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 26 27 /*设置引脚为上拉模式*/ 28 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 29 30 /*设置引脚速率为 2MHz */ 31 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 32 33 /*调用库函数,使用上面配置的 GPIO_InitStructure 初始化 GPIO*/ 34 GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); 35 36 /*选择要控制的 GPIO 引脚*/ 37 GPIO_InitStructure.GPIO_Pin = LED2_PIN; 38 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure); 39 40 /*选择要控制的 GPIO 引脚*/ 41 GPIO_InitStructure.GPIO_Pin = LED3_PIN; 42 GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure); 43 44 /*选择要控制的 GPIO 引脚*/ 45 GPIO_InitStructure.GPIO_Pin = LED4_PIN; 46 GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure); 47 48 /*关闭 RGB 灯*/ 49 LED_RGBOFF; 50 } 推挽模式跟开漏模式的区别: 置推挽模式,只能是输出模式,而输出高低电平的驱动电流都很大; 而开漏模式,即可作为输出,也可作为输入。 上拉就是把电位拉高,比如拉到Vcc;下拉就是把电压拉低,比如拉到GND;浮空输入,相当于该引脚接了高电平,引脚不建议悬空,易受干扰。 (1) 使用 GPIO_InitTypeDef 定义 GPIO 初始化结构体变量,以便下面用于存储 GPIO 配置。 (2) 调用库函数 RCC_AHB1PeriphClockCmd 来使能 LED 灯的 GPIO 端口时钟 (3) 向 GPIO 初始化结构体赋值,把引脚初始化成推挽输出模式,其中的 GPIO_Pin 使用宏“LEDx_PIN”来赋值,使函数的实现方便移植。 (4)使用以上初始化结构体的配置,调用 GPIO_Init 函数向寄存器写入参数,完成 GPIO 的 初始化 (5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它 LED 灯使用的 GPIO 引脚 (6) 使用宏控制 RGB 灯默认关闭, LED4 指示灯默认开启。  

 

4、主函数 1 #include "stm32f4xx.h" 2 #include "./led/bsp_led.h" 3 4 void Delay(__IO u32 nCount); 5 6 /** 7 * @brief 主函数 8 * @param 无 9 * @retval 无 10 */ 11 int main(void) 12 { 13 /* LED 端口初始化 */ 14 LED_GPIO_Config(); 15 16 /* 控制 LED 灯 */ 17 while (1) { 18 LED1( ON ); // 亮 19 Delay(0xFFFFFF); 20 LED1( OFF ); // 灭 21 22 LED2( ON ); // 亮 23 Delay(0xFFFFFF); 24 LED2( OFF ); // 灭 25 26 LED3( ON ); // 亮 27 Delay(0xFFFFFF); 28 LED3( OFF ); // 灭 29 30 /*轮流显示 红绿蓝黄紫青白 颜色*/ 31 LED_RED; 32 Delay(0xFFFFFF); 33 34 LED_GREEN; 35 Delay(0xFFFFFF); 36 37 LED_BLUE; 38 Delay(0xFFFFFF); 39 40 LED_YELLOW; 41 Delay(0xFFFFFF); 42 43 LED_PURPLE; 44 Delay(0xFFFFFF); 45 46 LED_CYAN; 47 Delay(0xFFFFFF); 48 49 LED_WHITE; 50 Delay(0xFFFFFF); 51 52 LED_RGBOFF; 53 Delay(0xFFFFFF); 54 } 55 } 56 57 void Delay(__IO uint32_t nCount) //简单的延时函数 58 { 59 for (; nCount != 0; nCount--); 60 } 在 main 函数中,调用我们前面定义的 LED_GPIO_Config 初始化好 LED 的控制引脚, 然后直接调用各种控制 LED 灯亮灭的宏来实现 LED 灯的控制。 以上,就是一个使用 STM32 标准软件库开发应用的流程。

 

 

 

附加          

#ifndef __LED_H #define    __LED_H

//是为了避免重复定义头文件 

 

自定义的头文件需要添加到路径里

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3